/*
 * UVa 232
 * 纵横字谜的答案
 */
// 题目太长，自行搜索

#include <iostream>
#include <fstream>
#include <iomanip>
#define LOCAL
using namespace std;
char grid[10][10]; // 网格
int flag[10][10];  // 标记起始格
int main()
{
#ifdef LOCAL
    ifstream cin("in.txt");
    ofstream cout("out.txt");
#endif
    int r,          // 网格的行
        c,          // 网格的列
        count,      // 起始格的个数
        amount = 0; // puzzle 数
    while (cin >> r >> c)
    {
        // 存网格，同时标记起始格
        count = 0;
        for (int i = 0; i < r; ++i)
            for (int j = 0; j < c; ++j)
            {
                cin >> grid[i][j];
                if ((i == 0 ||
                     j == 0 ||
                     grid[i][j - 1] == '*' ||
                     grid[i - 1][j] == '*') &&
                    grid[i][j] != '*')
                    flag[i][j] = ++count;
            }
        // output
        // 控制输出格式
        if (amount)
            cout << '\n';
        cout << "puzzle #" << ++amount << ":\n"
             << "Across";
        // Across（可以并入上面存网格步骤的两个 for 循环）
        for (int i = 0; i < r; ++i)
            for (int j = 0; j < c; ++j)
                if (grid[i][j] != '*')
                {
                    if (j == 0 || grid[i][j - 1] == '*')
                        cout << '\n'
                             << setw(3) << right << flag[i][j] << '.';
                    cout << grid[i][j];
                }
        cout << endl;
        // Down
        cout << "Down";
        for (int i = 0; i < r; ++i)
            for (int j = 0; j < c; ++j)
                if (grid[i][j] != '*' &&
                    (i == 0 || grid[i - 1][j] == '*'))
                {
                    cout << '\n'
                         << setw(3) << right << flag[i][j] << '.';
                    for (int k = i; k < r && grid[k][j] != '*'; ++k)
                        cout << grid[k][j];
                }
        cout << endl;
    }
    return 0;
}

// another passed answer
// #include <cstdio>
// using namespace std;
// int main()
// {
//     freopen("in.txt", "r", stdin);
//     freopen("out.txt", "w", stdout);
//     int po[10][10] = {0};
//     char p[10][10];
//     int r, c, kase = 0;
//     while (scanf("%d", &r) == 1 && r != 0)
//     {
//         scanf("%d", &c);
//         if (kase > 0)
//             putchar('\n');
//         printf("puzzle #%d:\nAcross\n", ++kase);
//         int t = 0;
//         for (int i = 0; i < r; i++)
//         {
//             scanf("%s", p[i]);
//             int pj = 0;
//             for (int j = 0; j < c; j++)
//             {
//                 if (p[i][j] == '*')
//                     continue;
//                 if (i == 0 || p[i - 1][j] == '*' || j == 0 || p[i][j - 1] == '*')
//                 {
//                     t++;
//                     po[i][j] = t;
//                     if (j >= pj)
//                     {
//                         int k;
//                         printf("%3d.", t);
//                         for (k = j; k < c && p[i][k] != '*'; k++)
//                             printf("%c", p[i][k]);
//                         pj = k + 1;
//                         putchar('\n');
//                     }
//                 }
//             }
//         }
//         printf("Down\n");
//         for (int i = 0; i < r; i++)
//         {
//             for (int j = 0; j < c; j++)
//             {
//                 if (po[i][j])
//                 {
//                     printf("%3d.", po[i][j]);
//                     for (int k = i; k < r && p[k][j] != '*'; k++)
//                     {
//                         po[k][j] = 0;
//                         printf("%c", p[k][j]);
//                     }
//                     putchar('\n');
//                 }
//             }
//         }
//     }
//     return 0;
// }